package com.example.mq.common;

import java.io.*;

/**
 * 序列化操作
 * 下列的操作 不仅是Message对象可以 其他的JAVA对象也是可以通过这个方法进行序列化和反序列化
 * (需要实现Serializable接口)
 */
public class BinaryTool {
    //把一个对象序列化成一个字节数组
    public static byte[] toBytes(Object object) throws IOException {
        //这个对象相当于一个边长的字节数组  为了处理这个我们使用以下方法
        //就可以把object序列化的数据给逐渐的写入到byteArrayOutputStream中 再统一转换成byte[]
        //这里的byteArrayOutputStream 相当于是一个存储在内存中的字节数组
        try(ByteArrayOutputStream byteArrayOutputStream=new ByteArrayOutputStream()){
            //其放在try对象中 可以自动关闭流对象
            try(ObjectOutputStream objectOutputStream=new ObjectOutputStream(byteArrayOutputStream)){
                //此处的writeObject 就会把对象进行序列化 生成的二进制数据 就会写入到
                //objectOutputStream中 由于objectOutputStream是关联到byteArrayOutputStream
                //所以最终结果就写到了byteArrayOutputStream中了
                objectOutputStream.writeObject(object);
            }
            //这个操作就是把byteArrayOutputStream 转换完成的二进制数据 取出来 转换成byte[]
            return byteArrayOutputStream.toByteArray();
        }
    }
    //把字节数组 反序列化成一个对象
    public static Object fromBytes(byte[] data) throws IOException, ClassNotFoundException {
        Object object=null;
        try(ByteArrayInputStream byteArrayInputStream=new ByteArrayInputStream(data)){
            try(ObjectInputStream objectInputStream=new ObjectInputStream(byteArrayInputStream)){
                //此处的readObject 是从data这个数组读取数据 并进行反序列化 转换成object对象
                object=objectInputStream.readObject();
            }
        }
        return object;
    }
}
